﻿import axios from 'axios'
import { ElLoading, ElMessage } from 'element-plus'
import { saveAs } from 'file-saver'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import { blobValidate } from '@/utils/ruoyi'
import request from '@/utils/request'
import useAppStore from '@/store/modules/app'

const baseURL = import.meta.env.VITE_APP_BASE_API
let downloadLoadingInstance;

export default {
  download(url, filename) {
    request({
      url,
      method: 'get',
      responseType: 'blob'
    }).then((data) => {
      // 创建一个Blob对象，包含要下载的内容
      const blob = new Blob([data]);
      // 创建一个隐藏的<a>元素用于触发下载
      const a = document.createElement('a');
      const resUrl = URL.createObjectURL(blob);
      a.href = resUrl;
      a.download = filename; // 设置下载文件名
      // 添加到DOM中，然后触发点击事件，最后移除
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
      // 释放Blob URL
      window.URL.revokeObjectURL(resUrl);
    })
  },


  /**
   * 跟新包下载
   */
  systemUpdateDownload(url, filename) {
    return window.download.downloadFile({url, filename});
  },

  /**
   * 可以展示下载进度
   */
  downloadProgress(url, filename, sysProgressName) {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'blob'; // 设置响应类型为二进制大对象
    xhr.onprogress = function(event) {
      if (event.lengthComputable) {
        const percentComplete = (event.loaded / event.total) * 100;
        useAppStore().sysProgressState.sysProgressName = sysProgressName || "下载更新包进度";
        useAppStore().sysProgressState.showSysProgress = true;
        const progress = percentComplete.toFixed(2);
        useAppStore().sysProgressState.sysProgress = progress > 100 ? 100 : +progress;
        console.log(`Download progress: ${progress}%`);
      }
    };
    xhr.onload = function() {
      if (xhr.status === 200) {
        const blob = new Blob([xhr.response]);
        const link = document.createElement('a');
        link.href = window.URL.createObjectURL(blob);
        link.download = filename;
        link.click();
        console.log('Download completed.');
      } else {
        console.error('Download failed.');
      }
    };
    xhr.onerror = function() {
      console.error('An error occurred during the transaction.');
    };
    xhr.send();
  },
  name(name, isDelete = true) {
    var url = baseURL + "/common/download?fileName=" + encodeURIComponent(name) + "&delete=" + isDelete
    axios({
      method: 'get',
      url: url,
      responseType: 'blob',
      headers: { 'Authorization': 'Bearer ' + getToken() }
    }).then((res) => {
      const isBlob = blobValidate(res.data);
      if (isBlob) {
        const blob = new Blob([res.data])
        this.saveAs(blob, decodeURIComponent(res.headers['download-filename']))
      } else {
        this.printErrMsg(res.data);
      }
    })
  },
  resource(resource) {
    var url = baseURL + "/common/download/resource?resource=" + encodeURIComponent(resource);
    axios({
      method: 'get',
      url: url,
      responseType: 'blob',
      headers: { 'Authorization': 'Bearer ' + getToken() }
    }).then((res) => {
      const isBlob = blobValidate(res.data);
      if (isBlob) {
        const blob = new Blob([res.data])
        this.saveAs(blob, decodeURIComponent(res.headers['download-filename']))
      } else {
        this.printErrMsg(res.data);
      }
    })
  },
  zip(url, name) {
    var url = baseURL + url
    downloadLoadingInstance = ElLoading.service({ text: "正在下载数据，请稍候", background: "rgba(0, 0, 0, 0.7)", })
    axios({
      method: 'get',
      url: url,
      responseType: 'blob',
      headers: { 'Authorization': 'Bearer ' + getToken() }
    }).then((res) => {
      const isBlob = blobValidate(res.data);
      if (isBlob) {
        const blob = new Blob([res.data], { type: 'application/zip' })
        this.saveAs(blob, name)
      } else {
        this.printErrMsg(res.data);
      }
      downloadLoadingInstance.close();
    }).catch((r) => {
      console.error(r)
      ElMessage.error('下载文件出现错误，请联系管理员！')
      downloadLoadingInstance.close();
    })
  },
  saveAs(text, name, opts) {
    saveAs(text, name, opts);
  },
  async printErrMsg(data) {
    const resText = await data.text();
    const rspObj = JSON.parse(resText);
    const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
    ElMessage.error(errMsg);
  }
}

